package cn.itcast.lucene.test;

import cn.itcast.LuceneApplication;
import cn.itcast.lucene.pojo.JobInfo;
import cn.itcast.lucene.service.LuceneService;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.*;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.util.Version;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * 1、分词器，对文本资源进行切分，将字符文本串按照一定的规则切分为一个个可以进行索引的最小单位（关键词），以便检索时使用。
 *     索引就相当于切分的一个个词.一个个词就是索引.搜索的时候根据索引搜索的.
 *
 */
@RunWith(SpringRunner.class)
@SpringBootTest(classes = LuceneApplication.class)
public class CreateIndex {

    @Autowired
    private LuceneService luceneService;

    /**
     * 创建索引
     */
    @Test
    public void createIndexTest() throws IOException {
        //获取索引库磁盘目录
        FSDirectory directory = FSDirectory.open(new File("D:\\elasticsearch-kibana\\LuceneCreateIndex"));
        //获取Lucene默认的标准分词器---获取文档,需要对文档进行分词
        //默认的分词器,查询的时候只能查一个字
        StandardAnalyzer analyzer = new StandardAnalyzer();
        //IKAnalyzer analyzer = new IKAnalyzer();
        IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_4_10_3,analyzer);
        //1、创建写入索引库对象  directory索引库位置    config 索引库写对象配置信息
        IndexWriter indexWriter = new IndexWriter(directory,config);
        //2、查询原始数据（数据库中数据）
        List<JobInfo> infoList = luceneService.findAll();
        List<Document> list = new ArrayList<>();
        for (JobInfo jobInfo : infoList) {
            //准备文档数据
            Document document = new Document();
            //组装文档字段  TextField 字符串格式数据，需要分词    StringField  字符串格式数据，不会分词
            document.add(new LongField("id",jobInfo.getId(), Field.Store.YES));
            //Field.Store 字段是否存储，基于该字段内容是否需要在页面展示。如果需要展示，则存储。如果不需要展示，则不存储
            document.add(new TextField("companyName",jobInfo.getCompanyName(), Field.Store.YES));
            document.add(new TextField("companyAddr",jobInfo.getCompanyAddr(), Field.Store.YES));
            document.add(new TextField("jobName",jobInfo.getJobName(), Field.Store.YES));
            document.add(new TextField("jobAddr",jobInfo.getJobAddr(), Field.Store.YES));
            document.add(new IntField("salary",jobInfo.getSalary(), Field.Store.YES));
            document.add(new StringField("url",jobInfo.getUrl(), Field.Store.YES));
//            StringField 不需要分词时使用  举例：url 、电话号码、身份证号等

            list.add(document);
        }

        indexWriter.addDocuments(list);
        //提交数据
        indexWriter.commit();
        //释放资源
        indexWriter.close();
    }


}
